package uy.org.softtech.cssuite.aspectos;

import static org.springframework.util.Assert.notNull;
import static uy.org.softtech.cssuite.helpers.HelperFechaHora.horaActual;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import uy.org.softtech.cssuite.servicios.ServiciosEstadisticas;

/**
 * Clase responsable de actualizar las estadísticas cuando un controlador es llamado.
 *
 * @author fabian.lobo
 */
@Aspect
@Component(value = "aspecto-estadistica")
public class EstadisticaControladores {
	
	private Logger log = Logger.getLogger(getClass());

	@Resource(name = "servicios-estadisticas")
	private ServiciosEstadisticas serviciosEstadisticas;
	
	/**
	 * Método para verificar que todos los parámetros han sido seteados correctamente.
	 * 
	 * @author fabian.lobo
	 */
	@PostConstruct
	public void inicializacion(){
		notNull(serviciosEstadisticas(), "La propiedad [serviciosEstadisticas] de [" + getClass().getName() + "] no ha sido establecida.");
		
		log.info("Implementación de los servicios relacionados a las estadísticas de las llamadas a controladores en la aplicación ha sido inicializado correctamente.");
	}
	
	@Around("execution(* uy.org.softtech.cssuite.web.controladores.Controlador*.*(..))")
	public Object actualizarEstaditicas(ProceedingJoinPoint joinPoint) throws Throwable {
		long inicio = horaActual().getTime();
		try {
			return joinPoint.proceed();
		} catch (Throwable t) {
			log.error(t);
		} finally {
			long fin = horaActual().getTime();
			String metodo = joinPoint.getSignature().toShortString();
			serviciosEstadisticas().actualizarEstadisticas(metodo, fin - inicio);
		}
		return null;
	}

	public ServiciosEstadisticas serviciosEstadisticas() {
		return serviciosEstadisticas;
	}

}
